package com.service;

import com.entity.FlightRealTimeData;
import io.dronefleet.mavlink.common.HomePosition;

import java.io.IOException;
import java.net.SocketException;
import java.util.List;

public interface DroneService {

    /**
     * 设置自动起飞模式
     * @throws IOException
     */
    void setAutoTakeoffMode() throws IOException;


    /**
     * 设置板外模式
     * @throws IOException
     */
    void setOffBoardMode() throws IOException;

    /**
     * 发送降落指令
     * @throws IOException
     */
    void sendLandCommand() throws IOException;

    /**
     * 发送指定心跳包
     * 指定系统类型为四轴飞行器
     * 指定自动驾驶仪类型为PX4。
     * 指定系统状态为待机状态。
     *指定MAVLink协议版本为3。
     */
    void sendHeartbeat() throws IOException;

    /**
     * 请求本地坐标系位置信息
     * @throws IOException
     */
    void requestLocalPositionNed() throws IOException;

    /**
     * 请求Home点位置信息
     * @throws IOException
     */
    HomePosition requestHomePosition() throws IOException, InterruptedException;

    /**
     * 请求角度信息
     * @throws IOException
     */
    void requestAttitude() throws IOException;

    void requestVFR_HUD() throws IOException;

    /**
     * 发送执行圆形轨迹控制命令 offBoard模式下
     * @param radius   圆形飞行轨迹半径
     * @param clockwise  顺时针 true | 逆时针 false
     * @param flightAltitude 飞行高度
     * @param cycle_s  飞行一圈所需时间
     * @param current_x 当前 x 坐标位置
     * @param current_y 当前 y 坐标位置
     */
    void sendflyCircleCmdOnOffBorad(float radius,boolean clockwise,float current_x, float current_y,float flightAltitude ,float cycle_s,boolean isUp) throws IOException, InterruptedException;

    /**
     * offboard下发送矩形轨迹飞行指令
     * @param length  长 m
     * @param width  宽 m
     * @param flightAltitude 飞行高度
     * @param current_x 当前位置 x
     * @param current_y 当前位置 y
     * @param clockwise 顺时针 true | 逆时针 false
     */
    void sendflyRectangleCmdOnOffBoard(float length, float width, float current_x, float current_y, float flightAltitude, boolean clockwise,float cycle_s) throws InterruptedException, IOException;

    /**
     * 设置自动返航模式  -- 直线返回Home并降落
     * @throws IOException
     */
    void setAutoReturnMode() throws IOException;

    /**
     * 设置自动任务模式 执行设定好的航点任务
     * @throws IOException
     */
    void setAutoMissionMode() throws IOException;

    /**
     * 设置自动留待模式 gps悬停模式
     * @throws IOException
     */
    void setAutoLoiterMode() throws IOException;

    /**
     * 设置自动降落模式
     * @throws IOException
     */
    void setAutoLandMode() throws IOException;

    /**
     *  点到点模式 不降落
     * @param startX
     * @param startY
     * @param endX
     * @param endY
     * @param flightAltitude
     * @param duration_s
     * @throws InterruptedException
     * @throws IOException
     */
    void flyPointToPoint(float startX, float startY, float endX, float endY,float flightAltitude,float duration_s) throws InterruptedException, IOException;


    /**
     * 通过点到点执行飞行矩形轨迹
     * @param flightAltitude
     * @param endX
     * @param endY
     * @param current_x
     * @param current_y
     * @param clockwise
     * @param duration_s
     * @throws InterruptedException
     * @throws IOException
     */
    void flyRectangleByP2P(float flightAltitude,float endX, float endY, float current_x, float current_y, boolean clockwise,float duration_s) throws InterruptedException, IOException;

    /**
     * 根据TimeId查询飞机实时数据
     * @param timeId
     */
    List<FlightRealTimeData> getFlightRealDataListByTimeId(String timeId);

    /**
     * 查询全部TimeId
     */
    List<String> getAllTimeId();

    /**
     * 摇杆控制
     * @param x
     * @param y
     * @param z
     * @param r
     */
//    void remoteControl(int x,int y,int z,int r) throws IOException;
    void remoteControl(float current_x,float current_y,float current_z,float current_yaw,int x,int y,int z,int r) throws IOException, InterruptedException;
    /**
     * 上锁飞机
     *
     */
    public void disArm() throws IOException;
}
